// 索引器，在ts里面只有当一个对象，开户了 索引器， 才能使用任何的 key 聚会
// interface Obj {
//   [key:string]:Function
// }

// var obj:Obj ={};
// var fn = obj['abc']
// fn()

interface EventBusType {
  events: { [key: string]: Function[] },
  on: (key: string, callback: Function) => void;
  emit: (key: string) => void;
}

export const EventBus: EventBusType = {
  events: {},
  // 用来订阅的
  on(key: string, callback: Function) {
    // 思路：
    // 使用一个数组，把 所有的 callback存起来，要保证 数组是和key是一一对应的
    if (!this.events[key]) {
      this.events[key] = []; // 初始化一个数组
    }
    this.events[key].push(callback);
  },
  // 用来发布的
  emit(key: string) {
    // 当发布的时候，把数组根据key取出来，依次调用里面的函数
    this.events[key]?.forEach(fn => fn())
  }
}
